package com.lollipop.synthential.concurrency.atomicdemo;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author: J.K
 * @Date: 2021-04-13 09:25
 * @Description: 并发编程-解决i++非原子性操作的问题-->单纯的使用volatile关键字去定义count变量是无效的，
 * 原因是当变量的值由自身的上一个值决定时，如i++,i=i+1等，volatile将失效，
 * 只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的，如i=j+1
 * 对于Demo1例子要保证count++是原子操作，可以使用synchronize关键字或者是将i++操作用原子类来代替
 */
public class AtomicIntegerDemo3 {
    private static final int THREADS_COUNT = 20;
    private static AtomicInteger count = new AtomicInteger();

    private static void increase() {
        count.incrementAndGet();
    }

//    private static int count = 0;
//
//    private static void increase() {
//        count++;
//    }

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREADS_COUNT];
        for (int i = 0; i < THREADS_COUNT; i++) {
            // 使用lambda表达式更简洁
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    increase();
                }
            });
            threads[i].start();
        }
        // 保证前面的线程都执行完成，得到多线程操作下的最终结果
        while (Thread.activeCount() > 1) {
            // 使当前线程由执行状态，变成为就绪状态，让出cpu时间，在下一个线程执行时候，此线程有可能被执行，也有可能没有被执行
            Thread.yield();
        }
        System.out.println(count);

    }

}
